# coding:utf-8

from os import path
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud, STOPWORDS

def generate_wordcloud(text):
    '''
    输入文本生成词云,如果是中文文本需要先进行分词处理
    '''
    # 设置显示方式
    d=path.dirname(__file__)

    # #圆形
    # x, y = np.ogrid[:300, :300]  # 创建0-300二维数组；
    # mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2  # 创建以 150，150为圆心，半径为130的Mask；
    # alice_mask = 255 * mask.astype(int)  # 转化为 int

    #正方形
    # 创建0-300二维数组
    x, y = np.ogrid[:300, :300]

    # 定义正方形的边界：左上角(100, 100)，右下角(200, 200)
    left, right = 100, 200
    top, bottom = 100, 200

    # 创建正方形的Mask
    mask = (left <= x) & (x < right) & (top <= y) & (y < bottom)

    # 转化为 int 并放大至255
    # square_mask = 255 * mask.astype(int)

    # alice_mask = np.array(Image.open(path.join(d, "Images//alice_mask.png")))
    font_path=path.join(d,"font//Roboto-Italic.ttf")

    # 自定义颜色函数
    # def custom_color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    #     return "hsl(210, 100%, 50%)"  # 设置颜色为蓝色

    # def multi_color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    #     colors = ["hsl(210, 100%, 50%)", "hsl(120, 100%, 50%)", "hsl(60, 100%, 50%)", "hsl(0, 100%, 50%)"]
    #     return colors[np.random.randint(0, len(colors))]

    # 创建颜色映射函数
    # def multi_color_func(word, font_size, position, orientation, random_state=None, **kwargs):
    #     colors = [
    #         "hsl(210, 100%, 70%)",  # 淡蓝色
    #         "hsl(120, 100%, 70%)",  # 淡绿色
    #         "hsl(60, 100%, 70%)",  # 淡黄色
    #         "hsl(0, 100%, 70%)",  # 淡红色
    #         "hsl(300, 100%, 70%)",  # 淡紫色
    #         "hsl(180, 100%, 70%)",  # 淡青色
    #         "hsl(90, 100%, 70%)",  # 淡黄绿色
    #         "hsl(240, 100%, 70%)"  # 淡靛蓝色
    #     ]
    #     return colors[np.random.randint(0, len(colors))]

    # 创建颜色映射函数
    def multi_color_func(word, font_size, position, orientation, random_state=None, **kwargs):
        colors = [
            "hsl(210, 60%, 50%)",  # 稳重的蓝色
            "hsl(120, 60%, 50%)",  # 稳重的绿色
            "hsl(60, 60%, 50%)",  # 稳重的黄色
            "hsl(0, 60%, 50%)",  # 稳重的红色
            "hsl(300, 60%, 50%)",  # 稳重的紫色
            "hsl(180, 60%, 50%)",  # 稳重的青色
            "hsl(90, 60%, 50%)",  # 稳重的黄绿色
            "hsl(240, 60%, 50%)"  # 稳重的靛蓝色
        ]
        return colors[np.random.randint(0, len(colors))]

    stopwords = set(STOPWORDS)
    wc = WordCloud(background_color="white",# 设置背景颜色
           max_words=2000, # 词云显示的最大词数  
           mask=mask,# 设置背景图片
           stopwords=stopwords, # 设置停用词
           font_path=font_path, # 兼容中文字体，不然中文会显示乱码
           color_func=multi_color_func  # 设置颜色

                  )

    # 生成词云 
    wc.generate(text)

    # 将词云图像转换为数组
    wordcloud_array = wc.to_array()

    # 创建带白边的更大图像
    border_size = 20
    new_size = (wordcloud_array.shape[0] + 2 * border_size, wordcloud_array.shape[1] + 2 * border_size)
    bordered_image = np.ones((new_size[0], new_size[1], 3), dtype=np.uint8) * 255  # 白色背景

    # 将词云图像嵌入到带白边的图像中
    bordered_image[border_size:-border_size, border_size:-border_size, :] = wordcloud_array

    # 生成的词云图像保存到本地
    wc.to_file(path.join(d, "Images//key_word.png"))

    # 显示图像
    plt.imshow(bordered_image, interpolation='bilinear')
    plt.imsave("Images//borded_key_word.png",bordered_image)
    # interpolation='bilinear' 表示插值方法为双线性插值
    plt.axis("off")# 关掉图像的坐标
    plt.show()

